package com.springboot.file.util.easyexcel.exception;

import com.springboot.file.exception.BusinessException;
import lombok.Getter;
import java.io.Serial;

/**
 * Excel处理异常类
 * 用于表示Excel数据处理过程中的通用错误
 */
@Getter
public class ExcelProcessingException extends BusinessException {
    
    @Serial
    private static final long serialVersionUID = 1L;
    
    /**
     * Sheet名称
     */
    private final String sheetName;
    
    /**
     * Sheet索引
     */
    private final int sheetIndex;
    
    /**
     * 行号
     */
    private final int rowIndex;
    
    /**
     * 列号
     */
    private final int columnIndex;
    
    /**
     * 构造函数
     *
     * @param message 错误消息
     * @param rowIndex 行号
     * @param columnIndex 列号
     * @param sheetName Sheet名称
     * @param sheetIndex Sheet索引
     */
    public ExcelProcessingException(String message, int rowIndex, int columnIndex, String sheetName, int sheetIndex) {
        super(message);
        this.rowIndex = rowIndex;
        this.columnIndex = columnIndex;
        this.sheetName = sheetName;
        this.sheetIndex = sheetIndex;
    }
    
    /**
     * 构造函数
     *
     * @param message 错误消息
     * @param cause 原始异常
     * @param rowIndex 行号
     * @param columnIndex 列号
     * @param sheetName Sheet名称
     * @param sheetIndex Sheet索引
     */
    public ExcelProcessingException(String message, Throwable cause, int rowIndex, int columnIndex, String sheetName, int sheetIndex) {
        super(400, message);
        this.rowIndex = rowIndex;
        this.columnIndex = columnIndex;
        this.sheetName = sheetName;
        this.sheetIndex = sheetIndex;
        this.initCause(cause);
    }
    
    /**
     * 获取格式化的错误消息
     *
     * @return 格式化的错误消息
     */
    public String getFormattedMessage() {
        if (columnIndex > 0) {
            return String.format("Sheet[%d:%s] 第%d行，第%d列数据处理失败: %s", 
                    sheetIndex, sheetName, rowIndex, columnIndex, getMessage());
        } else {
            return String.format("Sheet[%d:%s] 第%d行数据处理失败: %s", 
                    sheetIndex, sheetName, rowIndex, getMessage());
        }
    }
} 